#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int n; // 标记堆的大小
int heap[N]; // 存堆（大根堆）

// 向上调整算法
void up(int child)
{
    int parent = child / 2;
    if(parent >= 1 && heap[child] > heap[parent])
    {
        swap(heap[child], heap[parent]);
        child = parent;
        parent = child / 2;
    }
}
// 向下调整算法
void down(int parent)
{
    int child = parent * 2;
    while(child <= n)
    {
        if(child + 1 <= n && heap[child] < heap[child + 1]) child++;
        if(heap[child] <= heap[parent]) return;
        swap(heap[child], heap[parent]);
        parent = child;
        child = parent * 2;
    }
}
// 插入（把新来的元素放在最后一个位置，执行一次向上调整算法）
void push(int x)
{
    heap[++n] = x;
    up(n);
}
// 删除栈顶元素（将栈顶元素和最后一个元素交换，然后n--删除最后一个元素，进行一次向下调整算法）
void pop()
{
    swap(heap[1], heap[n]);
    n--;
    down(1);
}
// 堆顶元素（就是下标为1位置的元素）
int top()
{
    return heap[1];
}
// 堆的大小
int size()
{
    return n;
}
int main()
{
    // 测试堆
    int a[10] = {1, 41, 23, 10, 11, 2, -1, 99, 14, 0};
    for(int i = 0; i < 10; i++)
    {
        push(a[i]);
    }
    while(size())
    {
        cout << top() << " ";
        pop();
    }
    return 0;
}